import axios from 'axios'
import { Message } from 'element-ui'
import Cookies from 'js-cookie'
import router from '@/router'

const service = axios.create({
  baseURL: 'http://localhost:8080/api',
  timeout: 15000
})

// 请求拦截器
service.interceptors.request.use(
  config => {
    const token = Cookies.get('token')
    if (token) {
      config.headers['Authorization'] = 'Bearer ' + token
    }
    return config
  },
  error => {
    console.error(error)
    return Promise.reject(error)
  }
)

// 响应拦截器
service.interceptors.response.use(
  response => {
    const res = response.data
    
    if (res.code !== 200) {
      Message({
        message: res.message || '请求失败',
        type: 'error',
        duration: 5 * 1000
      })
      
      if (res.code === 401) {
        Cookies.remove('token')
        router.push('/login')
      }
      
      return Promise.reject(new Error(res.message || '请求失败'))
    } else {
      return res
    }
  },
  error => {
    console.error('请求错误：', error)
    
    let errorMessage = '网络错误，请稍后重试'
    
    if (error.response) {
      // 服务器返回了错误响应
      const { status, data } = error.response
      
      switch (status) {
        case 401:
          errorMessage = '登录已过期，请重新登录'
          Cookies.remove('token')
          router.push('/login')
          break
        case 403:
          errorMessage = '没有权限访问该资源'
          break
        case 404:
          errorMessage = '请求的资源不存在'
          break
        case 500:
          // 提取后端详细错误信息
          if (data && data.message) {
            errorMessage = `服务器错误: ${data.message}`
          } else if (error.message) {
            errorMessage = `服务器错误: ${error.message}`
          } else {
            errorMessage = '服务器内部错误，请联系管理员'
          }
          break
        default:
          if (data && data.message) {
            errorMessage = data.message
          } else if (error.message) {
            errorMessage = error.message
          }
      }
    } else if (error.request) {
      // 请求已发出但没有收到响应
      if (error.code === 'ECONNABORTED') {
        errorMessage = '请求超时，请检查网络连接'
      } else {
        errorMessage = '无法连接到服务器，请检查网络连接或服务器状态'
      }
    } else {
      // 请求配置出错
      errorMessage = error.message || '请求配置错误'
    }
    
    Message({
      message: errorMessage,
      type: 'error',
      duration: 5 * 1000
    })
    
    return Promise.reject(error)
  }
)

export default service

